# -*- coding: utf-8 -*-
# 通过IDM 下载器下载, 可以指定下载路径, 可以指定文件名, 可以指定 IDM 路径, 可以指定 IDM 参数
# 通过通配符匹配资源链接，并传到 IDM 任务列表\下载。
"""
@Time    : 2023/6/29 17:41
@Author  : leung9912
@FileName: idm.py
@Software: PyCharm
"""

import subprocess
import requests
import os
import sys
import re


sys.stdout.reconfigure(encoding="utf-8")
sys.stderr.reconfigure(encoding="utf-8")


def download_with_idm(url, output_dir, file_name=None, idm_path="D:\\pcRuanJian\\IDM\\IDM\\idman.exe"):
    """
    使用 IDM 进行资源下载。

    参数:
    url (str): 要下载的资源的 URL。
    output_dir (str): 下载文件的保存目录。
    file_name (str, 可选): 下载文件的名称。默认为 None，IDM 将自动从 URL 中提取文件名。
    idm_path (str, 可选): IDM 的安装路径，默认为标准安装路径。
    """
    try:
        if file_name:
            # 调用 idman.exe 并传递相应的参数
            """
            /d 表示下载
            /p 表示下载路径
            /f 表示文件名
            /n 表示静默模式
            /q 表示后台运行
            /quiet 表示静默模式下不显示对话框
            /a 表示添加到下载队列中
            /force 表示强制覆盖已存在的文件
            /auto 表示自动开始下载
            /merge 表示合并下载的文件
            """
            result = subprocess.run([idm_path, "/d", url, "/p", output_dir, "/f", file_name, "/n", "/q"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        else:
            result = subprocess.run([idm_path, "/d", url, "/p", output_dir, "/n", "/q"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        # 检查返回结果的 stdout 和 stderr
        if result.stdout:
            print("IDM 输出信息:", result.stdout.decode("utf-8"))
        if result.stderr:
            print("IDM 错误信息:", result.stderr.decode("utf-8"))
        return True
    except subprocess.CalledProcessError as e:
        print(f"调用 IDM 时出错: {e}")
        return False


def main():
    url_data = "https://mirrors.ustc.edu.cn/nginx/centos/9/x86_64/RPMS/"
    headers = {
        "user-agent": "Mozilla/50.0 (Windows NT 10.0; Win64; x86; rv:133.0) Gecko/20100101 Firefox/133.0"
    }
    try:
        response = requests.get(url_data, headers=headers)
        response.raise_for_status()  # 检查请求是否成功
    except requests.RequestException as e:
        print(f"请求失败: {e}")
        return
    
    # 通过请求的响应内容，提取所有的 href 链接，并存储到本地方便后续过滤
    # with open ("text.txt" , "w" , encoding="utf-8") as f:
    #     f.write(response.text)
    # print(response.text)

    with open ("text.txt", "r", encoding="utf-8") as file:
         content = file.read()   
    href = re.findall(r'href="(nginx.*?)"', content)
    data_dir = "D:\\Downloads\\nginx"
    if not os.path.exists(data_dir):
        os.makedirs(data_dir)

    all_downloads_successful = True
    for index, item in enumerate(href):
        url = url_data + item
        file_name = item.split("/")[-1]  # 从 href 中提取文件名
        if not download_with_idm(url, data_dir, file_name, idm_path="D:\\pcRuanJian\\IDM\\IDM\\idman.exe"):
            all_downloads_successful = False
        print("正在下载：", index, item)

    if all_downloads_successful:
        print("所有下载任务都下载完成。")
    else:
        print("部分下载任务添加到 IDM 时出现错误。")


if __name__ == "__main__":
    main()
